const log = console.log
// 5 使用5中方式声明数组arr,添加元素1-10
function fn1() {
  const arr = []
  for (let i = 0; i < 10; i++) {
    arr[i] = i + 1
  }
  console.log(arr)
}

function fn2() {
  const arr = new Array(10)
  for (let i = 0; i < 10; i++) {
    arr[i] = i + 1
  }
  console.log(arr)
}

function fn3() {
  const arr = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  console.log(arr)
}

function fn4() {
  const arr = Array.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  console.log(arr)
}

function fn5() {
  let str = ''
  for (let i = 0; i < 9; i++) {
    str += i + 1
  }
  const arr = Array.from(str)
  arr.push('10')
  for (let i = 0; i < arr.length; i++) {
    arr[i] = +arr[i]
  }
  return arr
}

// 2 计算数组的和
function fn6() {
  let arr = fn5()
  let sum = 0
  for (let i in arr) {
    sum += arr[i]
  }
  console.log(arr, sum)
}

// 3 反转数组元素
function fn7() {
  let arr = fn5()
  let len = arr.length
  for (let i = 0, j = len - 1; i < j; i++, j--) {
    let t = arr[i]
    arr[i] = arr[j]
    arr[j] = t
  }
  console.log(arr)
}

// 4 添加元素
function fn8() {
  let arr = fn5()
  arr.unshift(0)
  arr.push(100)
  console.log(arr)
}

// 5 对十个元素的数组第5个元素的位置添加1个0，输出数组的所有元素,此时数组长度是11
function fn9() {
  let arr = fn5()
  // 对数组进行扩容
  arr.push(0)
  console.log(arr)
  let index = 4
  let len = arr.length
  // 元素依次向后搬运
  for (let i = len - 1; i > index; i--) {
    arr[i] = arr[i - 1]
  }
  // 第五个元素赋值为0
  arr[index] = 0
  console.log(arr)
  // 在index位置删除?个元素，插入元素1,2,3
  // arr.splice(index,2,1,2,3)
  // console.log(arr)
}

// 6 for for-in for-of forEach遍历数组
let fn10 = () => {
  let sum = 0
  let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  for (let i = 0, n = arr.length; i < n; i++) {
    console.log(arr[i])
    if (arr[i] % 2 === 0) {
      sum += arr[i]
    }
  }
  let sum1 = 0
  for (let i in arr) {
    console.log(arr[i])
    if (arr[i] % 2 === 0) {
      sum1 += arr[i]
    }
  }
  let sum2 = 0
  for (let item of arr) {
    console.log(item)
    if (item % 2 === 0) {
      sum2 += item
    }
  }
  let sum3 = 0
  arr.forEach((item) => {
    if (item % 2 === 0) {
      sum3 += item
    }
  })
  console.log(sum, sum1, sum2, sum3)
}

// 7 声明一个数组，从头开始找到第1个大于10的元素下标
let fn11 = () => {
  let arr = [1, 20, 23, -4, 50, 90, 71, -8, 9, 910]
  let index = arr.findIndex((item) => item > 10)
  log(index, arr[index]) // 1 20
}

// 8 声明一个数组，从数组的后面找到第1个大于10的元素下标，并删除这个元素
let fn12 = () => {
  let arr = [1, 20, 23, -4, 50, 90, 71, -8, 9, 0]
  let index = arr.findLastIndex((item) => item > 10)
  if (index !== -1) {
    arr.splice(index, 1)
  }
  console.log(arr)
}

// 9 使用递归函数把多维数组转换为一维数组。
let arr = [1, [2, 3, [4, 5, [6, [7]]]], [8, 9]]
//  arr[1][2][2][1][0] = 7
let list = []
let fn13 = (arr) => {
  if (!Array.isArray(arr)) {
    return list.push(arr)
  }
  arr.forEach((item) => fn13(item))
}
// fn13(arr)
// log(arr)
// log(list)

// 遍历一个二维数组的所有元素
let fn14 = () => {
  let arrLv2 = [
    [0, 1],
    [2, 3],
    [4, 5],
    [6, 7],
  ]
  let n = arrLv2[0][0] // 0
  let n1 = arrLv2[0][1] // 1
  let n2 = arrLv2[1][1] // 3
  for (let item of arrLv2) {
    if (Array.isArray(item)) {
      for (let it of item) {
        log(it)
      }
    } else {
      log(item)
    }
  }
}

// 10 判断数组中所有的一维数组元素是否都是数组。arr = [1,[1],[[1]]], a[0] = 1, arr[1] = [1], arr[2] = [[1]]
let fn15 = () => {
  let arr = [[1], [1], [1, [1]]]
  let v = arr.every((item) => Array.isArray(item))
  log(v)
}

// 11 判断数组arr = [5, 12, 130, 12, 50, 44]中是否包含100，如果包含，则删除元素100
let fn16 = (arr, el) => {
  if (!Array.isArray(arr)) {
    log('请传递数组参数')
    return []
  }
  // arr参数不是数组
  // if (arr.includes(el)) {
  //   return arr.filter((x) => x !== el)
  // }

  // let index = arr.findIndex((x) => x === el)
  // if (index !== -1) {
  //   return arr.filter((x) => x !== el)
  // }

  let index = arr.indexOf(el)
  if (index !== -1) {
    return arr.filter((x) => x !== el)
  }
  return []
}
// log(fn16([5, 12, 100, 130, 100, 12, 50, 44], 12)) // [ 5, 12, 130, 12, 50, 44 ]

// 12 把数组[5, 12, 130, 12, 50, 44]转换为字符串,元素间使用'-'连接
let fn17 = (arr, opt) => {
  if (!Array.isArray(arr)) {
    log('请传递数组参数')
    return ''
  }
  return arr.join(opt)
}
// log(fn17([5, 12, 130, 12, 50, 44], '-')) // 5-12-130-12-50-44

// 13 对数组[5, 12, 130, 12, 50, 44]反转后并对所有元素+1,生成一个新数组
let fn18 = (arr, n) => {
  if (!Array.isArray(arr)) {
    log('请传递数组参数')
    return []
  }
  arr.reverse()
  return arr.map((x) => x + n)
}
// log(fn18([5, 12, 130, 12, 50, 44], 5)) // [ 45, 51, 13, 131, 13, 6 ]

// 14 使用两种方式对数组[5, 12, 130, 12, 50, 44]进行降序排序
let fn19 = (arr, flag) => {
  // flag=true 升序，反之降序
  if (!Array.isArray(arr)) {
    log('请传递数组参数')
    return []
  }
  let len = arr.length
  for (let i = 0; i < len - 1; i++) {
    for (let j = 0; j < len - i - 1; j++) {
      if (flag && arr[j] > arr[j + 1]) {
        let t = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = t
      } else if (!flag && arr[j] < arr[j + 1]) {
        let t = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = t
      }
    }
  }
  return arr
}
// log(fn19([5, 12, 130, 12, 50, 44], true))

let fn20 = (arr, flag) => {
  if (!Array.isArray(arr)) {
    log('请传递数组参数')
    return []
  }
  arr.sort((x, y) => (flag ? x - y : y - x))
  return arr
}
// log(fn20([5, 12, 130, 12, 50, 44], 1))

// 15 使用数组的reduce方法求5!(阶乘)
let fn21 = (n) => {
  n = Number.parseInt(n)
  if (Number.isNaN(n) || n < 0) {
    return log('负数不能求阶乘')
  }
  if (n === 1 || n === 0) {
    return 1
  }
  let list = []
  for (let i = 0; i < n; i++) {
    list.push(i + 1)
  }
  log(list)
  let res = list.reduce((prev, next) => prev * next)
  // response 响应：服务器返回的数据对象  result 结果： 程序运算的结果
  return res
}
log(fn21(5)) // 120
console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
